package fiuba.algo3.vehiculo;

import org.jdom2.Element;

import fiuba.algo3.mapa.Calle;
import fiuba.algo3.mapa.Esquina;
import fiuba.algo3.sorpresas.SorpresaNula;

public class Conductor {

	Vehiculo Vehiculo;
	Esquina ubicacion;
	int cantidadDeMovimientos;

	public Conductor() {
		Vehiculo = null;
		ubicacion = null;
		cantidadDeMovimientos = 0;
	}

	public Vehiculo getTipo() {
		return Vehiculo;
	}

	public Esquina getUbicacion() {
		return ubicacion;
	}

	public int getCantidadDeMovimientos() {
		return cantidadDeMovimientos;
	}
	
	public void setCantidadDeMovimientos(int unaCantidad){
		cantidadDeMovimientos = unaCantidad;
	}

	public void cambiarDeVehiculo(Vehiculo nuevoVehiculo) {
		Vehiculo = nuevoVehiculo;
	}

	public void setUbicacion(Esquina nuevaEsquina) {
		ubicacion = nuevaEsquina;
	}

	public void sumarMovimientos(int movimientos) {
		cantidadDeMovimientos = cantidadDeMovimientos + movimientos;
	}

	public void cambiarAlSiguienteVehiculo() {

		Vehiculo = Vehiculo.cambiarAlSiguienteVehiculo();
	}

	private void aplicarObstaculoYSorpresa(Calle unaCalle) {
			unaCalle.getObstaculo().aplicarA(Vehiculo);
			cantidadDeMovimientos = cantidadDeMovimientos + Vehiculo.getCantidadDeMovimientosDelTurno();
			Vehiculo.setCantidadDeMovimientosDelTurno(0);
			unaCalle.getSorpresa().aplicarA(this);
			unaCalle.setSorpresa(new SorpresaNula());
	}

	public void moverVehiculoSur() {
		if(ubicacion.tieneCalleSur()){

				Calle unaCalle = this.ubicacion.getCalleSur();
				aplicarObstaculoYSorpresa(unaCalle);
				if (this.Vehiculo.puedoPasar(unaCalle.getObstaculo())) {
					this.ubicacion = unaCalle.obtenerEsquinaOpuesta(ubicacion);
			}
			cantidadDeMovimientos++;
		}
	}

	public void moverVehiculoNorte() {
		if(ubicacion.tieneCalleNorte()){
	
				Calle unaCalle = this.ubicacion.getCalleNorte();
				aplicarObstaculoYSorpresa(unaCalle);
				if (this.Vehiculo.puedoPasar(unaCalle.getObstaculo())) {
					this.ubicacion = unaCalle.obtenerEsquinaOpuesta(ubicacion);
				}
			cantidadDeMovimientos++;
		}
	}

	public void moverVehiculoOeste() {
		if(ubicacion.tieneCalleOeste()){
				Calle unaCalle = this.ubicacion.getCalleOeste();
				aplicarObstaculoYSorpresa(unaCalle);
				if (this.Vehiculo.puedoPasar(unaCalle.getObstaculo())) {
					this.ubicacion = unaCalle.obtenerEsquinaOpuesta(ubicacion);
				}

			cantidadDeMovimientos++;
		}
	}

	public void moverVehiculoEste() {
		if(ubicacion.tieneCalleEste()){
				Calle unaCalle = this.ubicacion.getCalleEste();
				
				if (this.Vehiculo.puedoPasar(unaCalle.getObstaculo())) {
					aplicarObstaculoYSorpresa(unaCalle);
					this.ubicacion = unaCalle.obtenerEsquinaOpuesta(ubicacion);
				}
			cantidadDeMovimientos++;
		}
	}
	
	 public Element serializar(){
		 Element nodoConductor = new Element ("Conductor");
		 
		 nodoConductor.setAttribute("cantidadDeMovimientos", Integer.toString(this.cantidadDeMovimientos));
		 
		 Element nodoPosicion = new Element ("Posicion");
		 nodoPosicion.addContent(this.ubicacion.serializar());	
		 nodoConductor.addContent(nodoPosicion);
		 
		 nodoConductor.addContent(this.Vehiculo.serializar());
		 
		 return nodoConductor;		 
	 }
	 
	 
	 public Conductor(Element nodoConductor){
		 this.setCantidadDeMovimientos(Integer.parseInt(nodoConductor.getAttributeValue("cantidadDeMovimientos")));
		 
		 Element nodoPosicion = nodoConductor.getChild("Posicion");
		 this.setUbicacion(new Esquina(nodoPosicion.getChild("Esquina")));
		 
		 Element nodoVehiculo = nodoConductor.getChild("Vehiculo");
		 if(nodoVehiculo.getAttributeValue("tipoDeVehiculo").equals("auto")){
			 this.cambiarDeVehiculo(new Auto(nodoVehiculo));
		 }
		 else if(nodoVehiculo.getAttributeValue("tipoDeVehiculo").equals("moto")){
			 this.cambiarDeVehiculo(new Moto(nodoVehiculo));
		 }
		 else if(nodoVehiculo.getAttributeValue("tipoDeVehiculo").equals("camioneta4x4")){
			 this.cambiarDeVehiculo(new Camioneta4x4(nodoVehiculo));
		 }
	 }
}
